#ifndef EDGESOL_H_
#define EDGESOL_H_

#include <stdbool.h>
#include "edgeID.h"

/* Edge al senso della soluzione. per ragioni puramente computazionali si è rimossa l'informazione conosciuta ovunque come 'g' da edgeSol
 * per spostarla in solution. Questo comunque NON è concettualmente sbagliato poichè 'g' è condivisa da tutti i veicoli per il principio di
 * mutua esclusione sulla raccolta, pertanto ha senso che sia posseduta dalla prima struttura che conosce TUTTI i veicoli. */
typedef struct EdgeSol{
	/**indica l'arco che il camion percorre*/
	PedgeID id;
	/**indica il numero di volte che il camion passa dal particolare arco*/
	int x;
	//TODO trovare un modo piu' elegante per fare il controllo della connessione
	/**parametro di appoggio utilizzato da un qualunque algoritmo che utilizzi il <i>marking</i> degli archi. In genere <b>non</b> utilizzare questo campo.*/
	int marked;
} EdgeSol;

/**un puntatore a edgeSol per facilitare i passaggi per riferimento.
 *
 */
typedef EdgeSol* PedgeSol;

/**costurisce un nuovo arco da inserire in soluzione, copiando un riferimento. Non vengono
 * effettuati controlli per verificare se pe abbia i<j
 *
 * \pre
 *  \li pe non deve essere NULL
 *  \li pe deve essere validato
 *
 * @param pes puntatore all'edgeSol da inserire
 * @param _x il numero di volte che un particolare camion k passa nell'arco
 * @return un puntatore ad un EdgeSol eventualmente NULL in caso la memoria sia piena.
 */
PedgeSol initEdgeSol(PedgeID pe, int _x);

/**costurisce un nuovo arco da inserire in soluzione, copiando un riferimento. Non vengono
 * effettuati controlli per verificare se pe abbia i<j
 *
 * \pre
 *  \li pe non deve essere NULL
 *  \li pe deve essere validato
 * \post
 *  \li in memoria c'e una nuova istanza di EdgeSol
 *
 * @param pes puntatore all'edgeSol da inserire
 * @param _x il numero di volte che un particolare camion k passa nell'arco
 * @param _marked il campo marked da settare
 * @return un puntatore ad un EdgeSol eventualmente NULL in caso la memoria sia piena.
 */
PedgeSol initEdgeSolCustomized(PedgeID pe, int _x, int _marked);

/**dealloca lo spazio in memoria occupato da questo EdgeSol. Anche l'EdgeID puntato da questo EdgeSol
 * viene deallocato
 *
 * @param pes il puntatore all'EdgeSol da liberare. Non inserire come valore NULL
 */
void freeEdgeSol(PedgeSol pes);

/**clona l'oggetto passato
 *
 * \pre
 *  \li edgesol non NULL
 * \post
 *  \li in memoria viene allocato un nuovo oggetto EdgeSol da <b>deallocare</b> manualmente
 *
 * @param edgesol l'ogetto da clonare
 * @return un puntatore ad un'istanza separata ma coincidente come valori al parametro passato
 */
PedgeSol cloneEdgeSol(PedgeSol edgesol);

/**stampa un arco in soluzione. La stampa sara' nella forma:
 * <p>(0-1)[x:1g:F]</p>
 *
 * @param f il file in cui stampare l'edge
 * @param pes puntatore all'EdgeSol da stampare
 */
void printEdgeSol(FILE* f, PedgeSol pes);

#endif /* EDGESOL_H_ */
